﻿using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;


public partial class ctrlMenu : System.Web.UI.UserControl
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
            cGlobal objGlobal = new cGlobal();

            DataSet dts = objGlobal.objSeguridad.GetMenuUsuario(objGlobal.idAplicacion, objGlobal.idUsuario);
            this.CargarMenu(dts);           
        }
    }

    private void CargarMenu(DataSet dts)
    {
        if (dts.Tables[0].Rows.Count > 0)
        {             
            //Hace una copia de la tabla
            DataSet dtsCopia = dts.Copy();
            DataColumn[] keys = new DataColumn[1];
            keys[0] = dtsCopia.Tables[0].Columns["ID"];
            dtsCopia.Tables[0].PrimaryKey = keys;

            //Agrega una columna al dataset original para ir guardando el path        
            if (!(dts.Tables[0].Columns.Contains("PATH")))            
                dts.Tables[0].Columns.Add("PATH");
            
            //Recorre el dataset copia y va construyendo el path en el dataset original
            int i = 0;
            int idPadre = 0;
            string path = "";
            int nivel = 0;
            DataRow rw;            

            for (i = 0; i <= dtsCopia.Tables[0].Rows.Count - 1; i++)
            {
                //Si el nivel es cero el path es el mismo id
                if ((int)dts.Tables[0].Rows[i]["IDPADRE"] == 0)
                {
                    dts.Tables[0].Rows[i]["PATH"] = dts.Tables[0].Rows[i]["ID"];
                }
                else if ((int)dts.Tables[0].Rows[i]["IDPADRE"] > 0)
                {
                    //construye el path hasta encontrar un nodo con idPadre = 0
                    idPadre = (int)dts.Tables[0].Rows[i]["IDPADRE"];
                    path = dts.Tables[0].Rows[i]["ID"].ToString();
                    while (idPadre > 0)
                    {                        
                        //Busca el id del padre del menu actual
                        rw = dtsCopia.Tables[0].Rows.Find(idPadre);                        
                        path = rw["ID"] + "/" + path;
                        idPadre = (int)rw["IDPADRE"];
                    }
                    dts.Tables[0].Rows[i]["PATH"] = path;
                }
            }

            //Recorre el dataset y va agregando los nodos                            
            TreeNode nodoHijo;
            string pathPadre = "";
            string rutaIconos = ConfigurationManager.AppSettings["RUTAICONOSMENU"];
            
            for (i = 0; i <= dts.Tables[0].Rows.Count - 1; i++)
            {
                //si el idPadre es 0 es nodo raiz
                if ((int)dts.Tables[0].Rows[i]["IDPADRE"] == 0)
                {
                    //Agrega los nodos padre
                    if (dts.Tables[0].Rows[i]["IMAGEN"] != null)                    
                        this.tvwMenu.Nodes.Add(new TreeNode(dts.Tables[0].Rows[i]["NOMBRE"].ToString(), dts.Tables[0].Rows[i]["ID"].ToString(), rutaIconos + dts.Tables[0].Rows[i]["IMAGEN"].ToString(), dts.Tables[0].Rows[i]["URL"].ToString(), ""));                    
                    else                    
                        this.tvwMenu.Nodes.Add(new TreeNode(dts.Tables[0].Rows[i]["NOMBRE"].ToString(), dts.Tables[0].Rows[i]["ID"].ToString(), "", dts.Tables[0].Rows[i]["URL"].ToString(), ""));

                    //como es un nodo apdre, que no lleve a ninguna link
                    this.tvwMenu.Nodes[this.tvwMenu.Nodes.Count - 1].SelectAction = TreeNodeSelectAction.None;
                }                
                else if ((int)dts.Tables[0].Rows[i]["IDPADRE"] > 0)
                {
                    //Agrega los nodos hijos. Busca el nodo padre y lo agrega

                    string target = string.Empty;
                    if (dts.Tables[0].Rows[i]["TARGET"] != null)
                        target = dts.Tables[0].Rows[i]["TARGET"].ToString();

                    if (dts.Tables[0].Rows[i]["IMAGEN"] != null)
                        nodoHijo = new TreeNode(dts.Tables[0].Rows[i]["NOMBRE"].ToString(), dts.Tables[0].Rows[i]["ID"].ToString(), rutaIconos + dts.Tables[0].Rows[i]["IMAGEN"].ToString(), dts.Tables[0].Rows[i]["URL"].ToString(), target);
                    else
                        nodoHijo = new TreeNode(dts.Tables[0].Rows[i]["NOMBRE"].ToString(), dts.Tables[0].Rows[i]["ID"].ToString(), "", dts.Tables[0].Rows[i]["URL"].ToString(), target);

                    pathPadre = dts.Tables[0].Rows[i]["PATH"].ToString().Substring(0, dts.Tables[0].Rows[i]["PATH"].ToString().LastIndexOf("/"));
                    this.tvwMenu.FindNode(pathPadre).ChildNodes.Add(nodoHijo);
                }
            }

            //Agrega el menu de salir y de cambiar contraseña
            this.tvwMenu.Nodes.Add(new TreeNode("Cambiar contraseña", "0", rutaIconos + "lock.gif", "CambiarContrasena.aspx", ""));
            this.tvwMenu.Nodes.Add(new TreeNode("Salir", "0", rutaIconos + "salir.gif", "Salir.aspx", ""));
            this.tvwMenu.DataBind();
            

            //Expande el menú
            for (i = 0; i <= this.tvwMenu.Nodes.Count - 1; i++)
            {
                this.tvwMenu.Nodes[i].ExpandAll();
            }

        }
    }
}
